记一次RedHat文件夹访问权限设定

起因

家里有闲置的电脑,于是我给他装上了RedHat 9.4,准备将一些资料存到上面,于是我装Samba服务将磁盘共享出来,又不想直接使用root权限进行登录,于是做了一个其他账户;
这一系列做完后,又将Hexo迁移到Linux上,于是我在Samba共享的磁盘下面给出了一个文件夹用于hexo,比较Windows写MD比较顺手嘛。本着不同账户管理的思想,于是我又建了一个Hexo账户,用于正对Hexo的部署和生成,此时就发现不同账户生成的文件夹和文件,归属权和操作权在不同终端或者Windows资源管理器上没权限操作,于是我就给文件夹指定了特地账户可以完全访问的权限。

开始操作

为了实现在 Red Hat 系统上自动给指定文件夹及其所有子文件夹和文件设置两个特定账户的完全访问权限(读、写、执行),可以使用 bash 脚本结合 chownchmodsetfacl 命令。
注意,chown 命令用于改变文件或目录的所有者,而完全访问权限(读、写、执行)通常通过调整权限(使用 chmod)和访问控制列表(使用 setfacl)来实现。
以下是三个命令的一些基本用法;

chown (改变某个文件或目录的所有者和所属的组)

chownchange owner),其功能是命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。

chmod (变更文件或目录的权限)

chmodchange mode),其功能是改变文件或目录权限的命令。默认只有文件的所有者和管理员可以设置文件权限,普通用户只能管理自己文件的权限属性。

setfacl (精确的控制文件权限的分配)

setfaclset file access control list 即”设置文件访问控制列表“) 其功能是可以更加精确的控制文件权限的分配,比如让某一个用户对某一个文件具有某种权限。

总的来说setfacl命令可以用来细分linux下的文件权限。
chmod命令可以把文件权限分为u,g,o三个组,而setfacl可以对每一个文件或目录设置更精确的文件权限。
比如:让某一个用户对某一个文件具有某种权限。
这种独立于传统的u,g,o的rwx权限之外的具体权限设置叫ACLAccess Control List

ACL可以针对单一用户、单一文件或目录来进行r,w,x的权限控制,对于需要特殊权限的使用状况有一定帮助。
如,某一个文件,不让单一的某个用户访问。
使用setfacl前,要先确保你的系统支持 ACL(访问控制列表),这可以通过运行 getfacl 命令来检查。如果系统提示找不到该命令,你可能需要安装 acl 包。

1
2
3
[hexo@sea-whales seawhales]$ getfacl
Usage: getfacl [-aceEsRLPtpndvh] file ...
Try `getfacl --help' for more information.

如果不支持可以执行以下命令,我这边是已经安装了所以没有过程:

1
2
3
4
5
6
7
8
[root@sea-whales ~]# yum install acl -y
正在更新 Subscription Management 软件仓库。
上次元数据过期检查:0:59:08 前,执行于 2024年07月14日 星期日 20时01分07秒。
软件包 acl-2.3.1-4.el9.x86_64 已安装。
依赖关系解决。
无需任何处理。
完毕!
[root@sea-whales ~]#

执行命令

1
setfacl -R -m u:"hexo":rwx "/home/hexo"

于是我就想如果有很多用户那就得执行很多一样的命令于是我就把他写成脚本,假设想让 /path/to/directory 目录及其所有子目录和文件对 user1user2 拥有完全访问权限(即读、写、执行)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

# 设定目标目录
TARGET_DIR="/path/to/directory"

# 设定需要添加权限的用户
USERS=("user1" "user2")

# 设置目录和文件的初始权限
# 例如,给所有者读写执行权限,给组和其他用户读执行权限
# 注意:你可能需要根据实际情况调整这些权限
chmod -R 755 "$TARGET_DIR"

# 遍历用户列表,为每个用户设置ACL
for USER in "${USERS[@]}"; do
# 设置用户对目录的完全控制(rwx)
# 注意:对于目录,通常需要执行权限来进入
setfacl -R -m u:"$USER":rwx "$TARGET_DIR"
# 如果需要,你还可以设置默认ACL,以便新创建的文件和目录也继承这些权限
setfacl -R -d -m u:"$USER":rwx "$TARGET_DIR"
done

echo "权限设置完成,$TARGET_DIR 目录及其所有子目录和文件现在对 ${USERS[*]} 拥有完全访问权限。"

注意

  1. 脚本中的 chmod -R 755 "$TARGET_DIR" 设置了目录和文件的初始权限。你可能需要根据实际情况调整这些权限。
  2. setfacl -R -m u:"$USER":rwx "$TARGET_DIR" 命令给每个用户设置了对目录和文件的完全访问权限(读、写、执行)。-R 选项表示递归地应用到所有子目录和文件。
  3. setfacl -R -d -m u:"$USER":rwx "$TARGET_DIR" 命令设置了默认 ACL,这意呀着在 $TARGET_DIR 下新创建的文件和目录将自动继承这些 ACL 规则。
  4. 请确保 $TARGET_DIRUSERS 数组中的值根据你的需求进行了正确的设置。
  5. 运行此脚本可能需要 root 权限,因为修改文件系统的权限和 ACL 通常需要超级用户权限。

保存此脚本到一个文件中,例如 set_directory_permissions.sh,然后通过运行 chmod +x set_directory_permissions.sh 使其可执行,最后以 root 用户身份执行它:sudo ./set_directory_permissions.sh